#if !defined(_APP_DEVICE)
#define _APP_DEVICE
#include "app_buffer.h"
#include <pthread.h>

typedef struct {
	char *dev_file_name ; //设备文件名 
	int  dev_fd; //设备文件描述符
	buffer_t *up_buffer; //上行缓冲区
	buffer_t *down_buffer; //下行缓冲区
	pthread_t  dev_read_thread; //读取设备的线程
	int (*post_read)(char*,int) ; //读后预处理函数  //根据不同的芯片 设置不同的预处理
	int (*pre_write)(char*,int) ; //写前预处理函数 
	int is_running; //设备当前的运行状态
	long  last_write_ts_ms; //上次写入时间
	int  write_interval_ms; //写入间隔
}  device_t;

/**
 * @brief 初始化设备
 * @param 设备的文件地址
 * @return 设备结构体
 */
device_t *app_device_init(char *dev_file_name);


/**
 * @brief 启动设备读取操作
 * //1 启动从蓝牙串口中读取数据 (上行线路开始)
 * //2 向消息队列模块中注册接收数据后的处理函数 （下行线路开始）
 *
 */
int app_device_start();


/**
 * @brief  从蓝牙芯片中读取数据（异步方法） 图中1号
 *
 */
void *app_device_read(void *arg);

/**
 * @brief 从缓冲区中读取数据写入到mqtt中（异步方法、线程池执行）图中2号
 *
 */
void *app_device_send_to_mqtt(void *arg);


/**
 * @brief 从mqtt中接收数据到缓冲中 （注册给消息队列模块） 图中3号
 *
 */
int app_device_receive_from_mqtt( char *data,int data_len);

/**
 * @brief 从下行缓冲区向蓝牙芯片中写入数据（异步方法 线程池x执行） 图中4号
 *
 */
void *app_device_write(void *arg);

/**
 * @brief 停止设备读取操作 销毁设备
 *
 */
void app_device_destroy();


#endif // _APP_DEVICE
